Ahora que las librerías de C finales se han instalado, es hora de ajustar la cadena de herramientas para que enlacen cualquier nuevo programa compilado contra estas nuevas librerías.
En primer lugar, haga copias de seguridad de /tools
linker, y sustitúyelo por el enlazador que hicimos en el Capítulo 5. También crearemos un enlace a su contraparte en
/tools/$(gcc -dumpmachine)/bin
:
mv -v /tools/bin/{ld,ld-old} mv -v /tools/$(gcc -dumpmachine)/bin/{ld,ld-old} mv -v /tools/bin/{ld-new,ld} ln -sv /tools/bin/ld /tools/$(gcc -dumpmachine)/bin/ld
A continuación, modificar el fichero de especificaciones de GCC para que apunte al nuevo enlazador dinámico. La simple supresión de todas las instancias de "/ tools" debería dejarnos con la ruta correcta para el enlazador dinámico. Ajuste también el fichero de especificaciones de GCC para que sepa dónde encontrar las cabeceras correctas y ficheros der inicio de Glibc. El comando sed logra esto:
gcc -dumpspecs | sed -e 's@/tools@@g' \ -e '/\*startfile_prefix_spec:/{n;s@.*@/usr/lib/ @}' \ -e '/\*cpp:/{n;s@$@ -isystem /usr/include@}' > \ `dirname $(gcc --print-libgcc-file-name)`/specs
Es una buena idea inspeccionar visualmente el fichero de especificaciones para verificar que los cambios deseados se hizo realidad.
Es imprescindible en este momento asegurarse de que las operaciones básicas (compilación y enlazado) de la cadena de herramientas funcionan como se esperaba. Para ello, realice los siguientes chequeos:
echo 'main(){}' > dummy.c cc dummy.c -v -Wl,--verbose &> dummy.log readelf -l a.out | grep ': /lib'
Si todo funciona correctamente, no debe haber errores y la salida del último comando debe ser (con las diferencias para la plataforma sobre el nombre del enlazador dinámico):
[Requesting program interpreter: /lib/ld-linux.so.2]
Tenga en cuenta que /lib
aparezca como prefijo de tu enlazador dinámico.
Ahora asegúrese de que lo hemos configurado para usar los ficheros de inicio correctos:
grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log
Si todo funciona correctamente, no debe haber errores y la salida del último comando debe ser:
/usr/lib/crt1.o succeeded
/usr/lib/crti.o succeeded
/usr/lib/crtn.o succeeded
Verifique que el compilador busca los archivos de cabecera correctos:
grep -B1 '^ /usr/include' dummy.log
Este comando debe devolver con éxito con el siguiente resultado:
#include <...> search starts here:
/usr/include
A continuación, compruebe que el nuevo enlazador se está usando con la ruta de búsqueda correcta:
grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'
Si todo funciona correctamente, no debe haber errores y la salida del último comando debe ser:
SEARCH_DIR("/usr/lib")
SEARCH_DIR("/lib");
A continuación asegúrese de que estamos utilizando la libc correcta:
grep "/lib.*/libc.so.6 " dummy.log
Si todo funciona correctamente, no debe haber errores y la salida del último comando (permitiendo un directorio lib64 en 64 bits hosts) serán:
attempt to open /lib/libc.so.6 succeeded
Por último, asegúrese de que GCC utiliza el enlazador dinámico correcto:
grep found dummy.log
Si todo funciona correctamente, no debe haber errores y la salida del último comando debe ser (con las diferencias para la plataforma sobre el nombre del enlazador dinámico y un directorio lib64 en 64 bits hosts):
found ld-linux.so.2 at /lib/ld-linux.so.2
Si la salida no aparece como se muestra arriba, o no se recibe nada en absoluto, entonces algo está seriamente mal. Investiga y sigue los pasos para averiguar dónde está el problema y corregirlo. La razón más probable es que algo salió mal en el arreglo del fichero specs. Tendrán que ser resueltos antes de continuar con el proceso de cualquier problema.
Una vez que todo está trabajando correctamente, limpiar los ficheros de prueba:
rm -v dummy.c a.out dummy.log